package com.pe.pgn.clubpgn.webapp.controller.reasignaciontarjeta;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.domain.ClpbEstacion;
import com.pe.pgn.clubpgn.domain.beans.BNRango;
import com.pe.pgn.clubpgn.domain.beans.BNTarjetaPersona;
import com.pe.pgn.clubpgn.service.TarjetaPersonaService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

@Controller
@RequestMapping("/reasignaciontarjeta/**")
public class ReasignacionTarjetaController extends BaseFormController{

	@Autowired
	private TarjetaPersonaService tarjetaPersonaService;
	
	@RequestMapping(value = "/reasignaciontarjetaform.html", method = RequestMethod.GET)
    public @ModelAttribute("reasignacionTarjetaPersona")BNTarjetaPersona initReasignacionTarjetas(
    		@ModelAttribute("reasignacionTarjetaPersona") BNTarjetaPersona tarjetaPersona,
    		@RequestParam(value = "search", required = false) String search, Model model) {

		model = asignarVariablesComunesdeActualizacion(model,tarjetaPersona);
		return tarjetaPersona;
    }
	
	@RequestMapping(value = "/reasignaciontarjetaform.html", method = RequestMethod.POST)
    public String guardarReasignacionTarjetas(@ModelAttribute("reasignacionTarjetaPersona") BNTarjetaPersona tarjetaPersona, 
    		BindingResult result, SessionStatus status, HttpServletRequest request, Model model) {

		if (result.hasErrors()){
			model = asignarVariablesComunesdeActualizacion(model,tarjetaPersona);
			return "/reasignaciontarjeta/reasignaciontarjetaform";
		}
		
		boolean existeRango = tarjetaPersonaService.existeRango(tarjetaPersona);
		if(!existeRango){
			model = asignarVariablesComunesdeActualizacion(model,tarjetaPersona);
			saveError(request, getText("reasignaciontarjetapersona.error.not.exists.group", request.getLocale()));
			return "/reasignaciontarjeta/reasignaciontarjetaform";
		}
		
		boolean existenAsignados = tarjetaPersonaService.existenCodigosAsignadosEnRangoPorEstacion(tarjetaPersona);
		if(existenAsignados){
			model = asignarVariablesComunesdeActualizacion(model,tarjetaPersona);
			saveError(request, getText("reasignaciontarjetapersona.rangos.asignados", request.getLocale()));
			return "/reasignaciontarjeta/reasignaciontarjetaform";
		}
		
		tarjetaPersonaService.reasignarTarjetasPersonas(tarjetaPersona);
		saveMessage(request, getText("tarjetapersonaform.group.updated", request.getLocale()));
		return "redirect:reasignaciontarjetaform.html";
    }
	
	private Model asignarVariablesComunesdeActualizacion(Model model, BNTarjetaPersona tarjetaPersona){
		List<ClpbEstacion> estaciones = tarjetaPersonaService.obtenerEstaciones();
		model.addAttribute("estaciones", estaciones);
		
		Long coEstacion = null;
		if(ValidationUtil.validateList(estaciones)){
			ClpbEstacion bean = estaciones.get(0);
			tarjetaPersona.setHdnCoEstacion(coEstacion);
			coEstacion = bean.getId();
		}		
		
		List<BNRango> rangos = tarjetaPersonaService.obtenerRangosTarjetaDisponiblesPorEstacion(coEstacion);
		model.addAttribute("reasignacionTarjetaPersona", tarjetaPersona);
		model.addAttribute("rangos", rangos);
		return model;
	}
}
